マテリアライズド・ビュー (Materialized View : MV) は、データベース内のベース・テーブルとして、クエリの結果を保存します。クエリはベース・テーブルからの大量のデータを集約するため、通常はその計算結果を保存するためにマテリアライズド・ビューを使用します。マテリアライズド・ビューは、ビューやテーブルといった他のデータベース・オブジェクトと比べて、オプティマイザとの対話に優れているという利点があります。またマテリアライズド・ビューは、コストのかかるクエリの結果を保存して、あらかじめ集中的に作業を進めることにより、パフォーマンスの向上を実現します。
SQL Anywhere 10 の場合、マテリアライズド・ビューはビューがベースとしているベース・テーブルが変更されると、即座に
'Stale' になります。マテリアライズド・ビューのコンテンツを更新するためには、定期的に手作業でビューをリフレッシュする必要があります。マテリアライズド・ビューをリフレッシュすると、マテリアライズド・ビューのコンテンツは削除され、新しいクエリの結果と入れ替わってしまいま
す。SQL Anywhere 11 を使用すれば、マテリアライズド・ビューが自動的に最新データを保持するように設定できます。このため、マテリアライズド・ビューがベースとする基本テーブルが
(挿入/更新/削除によって) 変更されると、マテリアライズド・ビューも更新され、これらの変更内容が反映されます。
即時ビューのサンプル
このサンプルでは、マテリアライズド・ビューを即座にメンテナンスするデモを実演します。この機能により、開発者がアプリケーションでマテリアライズド・ビューを使用する際の負担を軽減するとともに、最適化を行う際にオプティマイザが実体化ビューの利点を生かすことができます。
- Interactive SQL を起動し、ODBC から SQL Anywhere 11 Demo データベースに接続します。
Windows の場合は、コマンド・プロンプトを開きます。
Linux の場合は、ターミナルを開きます。SQL Anywhere のサンプルがインストールされているかの確認が完了していない場合は、$SQLANY11/samples/sample_config32.sh
のファイルを実行して確認します。
以下のコマンドを実行します。
dbisql -c "dsn=SQL Anywhere 11 Demo"
- 各製品の売上高に従い、サイズと年度ごとにマテリアライズド・ビューを作成します
(ユニット、ドル)。このビューを、手作業でリフレッシュするビューに指定します。Interactive
SQL で、[F5] を押して以下の文を実行します。
CREATE MATERIALIZED VIEW groupo.mv_manualrefresh AS
SELECT year( s.shipdate) AS yr, p.name AS name, p.size AS size,
sum(s.quantity) AS total_quantity,
sum(p.unitprice) AS total_price,
count(*) AS num_records
FROM salesorderitems s, products p
WHERE p.id = s.productid
GROUP BY name, size, yr;
CREATE UNIQUE INDEX mvidx ON groupo.mv_manualrefresh( yr,
name, size );
ALTER MATERIALIZED VIEW groupo.mv_manualrefresh MANUAL
REFRESH;
- 各製品の売上高に応じて、サイズと年度ごとにもう一つマテリアライズド・ビューを作成します
(ユニット、ドル)。ここでは、自動的にリフレッシュ可能なビューに指定します
(キーワード IMMEDIATE REFRESH を使用することに注意してください)。
CREATE MATERIALIZED VIEW groupo.mv_autorefresh AS
SELECT year( s.shipdate) AS yr, p.name AS name, p.size AS size,
sum(s.quantity) AS total_quantity,
sum(p.unitprice) AS total_price,
count(*) AS num_records
FROM salesorderitems s, products p
WHERE p.id = s.productid
GROUP BY name, size, yr;
CREATE UNIQUE INDEX mvidx ON groupo.mv_autorefresh( yr, name,
size );
ALTER MATERIALIZED VIEW groupo.mv_autorefresh IMMEDIATE
REFRESH;
- 以下の SQL 文を実行してマテリアライズド・ビューにデータを移植します。
REFRESH MATERIALIZED VIEW groupo.mv_manualrefresh;
REFRESH MATERIALIZED VIEW groupo.mv_autorefresh;
- 以下のクエリを実行して、ビューのコンテンツを取り出します。
SELECT * FROM mv_manualrefresh ORDER BY name, size, yr;
- 以下の SQL バッチを実行して、データベースに販売注文を数件追加します。
BEGIN
DECLARE lastid INTEGER;
INSERT INTO salesorders
VALUES (DEFAULT, 101, today(), 'r1', 'Eastern', 299);
SELECT @@identity INTO lastid;
INSERT INTO salesorderitems VALUES (lastid, 1, 300, 12,
today());
INSERT INTO salesorderitems VALUES (lastid, 2, 400, 29,
today());
INSERT INTO salesorderitems VALUES (lastid, 3, 500, 8, today());
COMMIT;
END;
- 新しい注文を追加した場合の影響を確認するために、以下のコマンドを実行して、マニュアル・ビュー
mv_manualrefresh のコンテンツを確認します。
SELECT * FROM mv_manualrefresh ORDER BY name, size, yr;
新しい販売注文を追加しても、結果一覧には何も変化がないことを確認してください。
- 以下のコマンドを実行して、即時ビュー mv_autorefresh のコンテンツを確認してください。
SELECT * FROM mv_autorefresh ORDER BY name, size, yr;
マテリアライズド・ビューは自動的に更新され、新しい販売注文の追加が反映されていることを確認してください。
結論
SQL Anywhere Ver.11 は、ベース・データ・テーブルの変更を検知すると、即時マテリアライズド・ビューを自動的にリフレッシュします。即時ビューを作成する場合は、ALTER
MATERIALIZED VIEW ... IMMEDIATE REFRESH の文を実行して、マテリアライズド・ビューのリフレッシュ方式を即時
に変更します。または、Sybase Central 管理ツールを使用して、グラフィカルに実行することも可能です。
ただし、即時ビューで作業する場合は、一定の制約について注意が必要なため、詳細についてはオンライン・マニュアルを確認してください。
|